package com.qsw.httpnetlib.net.core;

import android.app.Application;

import com.qsw.httpnetlib.net.core.callback.OnNetCallback;

import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Map;

/**
 * 基本网络操作对外开放类
 */
public class NetModel {

    private NetManager mNetManager;

    private static NetModel mNetModel;

    private NetModel() {
        init();
    }

    public static NetModel getInstance() {
        if (mNetModel == null) {
            synchronized (NetModel.class) {
                if (mNetModel == null) {
                    mNetModel = new NetModel();
                }
            }
        }
        return mNetModel;
    }

    private void init() {
        mNetManager = new NetManager();
    }

    /**
     * 设置读取超时时间，该方法必须在{@link NetModel#getInstance()}之前调用
     *
     * @param readTimeOut 读取超时时间，单位：毫秒
     */
    public static void setReadTimeOut(int readTimeOut) {
        NetConfig.TIMEOUT_READ = readTimeOut;
    }

    /**
     * 设置是否打印请求/响应日志，默认为关闭
     *
     * @param enable 是否打印请求/响应日志
     */
    public static void setRequestResponseLogEnable(boolean enable) {
        NetConfig.PRINT_REQUEST_RESPONSE_LOG = enable;
    }

    /**
     * 设置HTTPS支持，该方法必须在{@link NetModel#getInstance()}之前调用
     *
     * @param cerFile cer文件
     */
    public static void supportHTTPS(File cerFile) {
        NetConfig.HTTPS_CER_FILE = cerFile;
    }

    /**
     * 设置HTTPS支持，该方法必须在{@link NetModel#getInstance()}之前调用
     *
     * @param context           环境
     * @param assetsCerFileName 位于APP中的assets文件夹中的cer文件名
     */
    public static void supportHTTPS(Application context, String assetsCerFileName) {
        NetConfig.CONTEXT = context;
        NetConfig.ASSETS_HTTPS_CER_FILENAME = assetsCerFileName;
    }

    /**
     * 异步Put请求
     *
     * @param url           请求地址
     * @param params        请求参数
     * @param onNetCallback 网络事件回调
     */
    public void putAsynch(String url, Map<String, String> params, final OnNetCallback onNetCallback) {
        mNetManager.putAsynch(url, params, onNetCallback);
    }

    /**
     * 异步Put请求
     *
     * @param url           请求地址
     * @param headers       请求头
     * @param params        请求参数
     * @param onNetCallback 网络事件回调
     */
    public void putAsynch(String url, Map<String, String> headers, Map<String, String> params, final OnNetCallback onNetCallback) {
        mNetManager.putAsynch(url, headers, params, onNetCallback);
    }

    /**
     * 异步Put请求
     *
     * @param url            请求地址
     * @param pathSegments   路径段参数
     * @param queryParameter 路径参数
     * @param headers        请求头
     * @param params         请求参数
     * @param onNetCallback  网络事件回调
     */
    public void putAsynch(String url, final List<String> pathSegments, final Map<String, String> queryParameter,
                          Map<String, String> headers, Map<String, String> params, OnNetCallback onNetCallback) {
        mNetManager.putAsynch(url, pathSegments, queryParameter, headers, params, onNetCallback);
    }

    /**
     * 异步Put请求数据
     *
     * @param url           请求地址
     * @param headers       请求头
     * @param contentType   contentType
     * @param content       content
     * @param onNetCallback 网络事件回调
     */
    public void putAsynch(String url, Map<String, String> headers, String contentType, String content, final OnNetCallback onNetCallback) {
        mNetManager.putAsynch(url, headers, contentType, content, onNetCallback);
    }

    /**
     * 异步Put请求数据
     *
     * @param url            请求地址
     * @param pathSegments   路径段参数
     * @param queryParameter 路径参数
     * @param headers        请求头
     * @param contentType    contentType
     * @param content        content
     * @param onNetCallback  网络事件回调
     */
    public void putAsynch(String url, final List<String> pathSegments, final Map<String, String> queryParameter,
                          Map<String, String> headers, String contentType, String content, final OnNetCallback onNetCallback) {
        mNetManager.putAsynch(url, pathSegments, queryParameter, headers, contentType, content, onNetCallback);
    }

    /**
     * 异步Put请求数据
     *
     * @param url           请求地址
     * @param headers       请求头
     * @param contentType   contentType
     * @param content       content
     * @param onNetCallback 网络事件回调
     */
    public void putAsynch(String url, Map<String, String> headers, String contentType, byte[] content, final OnNetCallback onNetCallback) {
        mNetManager.putAsynch(url, headers, contentType, content, onNetCallback);
    }

    /**
     * 异步Put请求数据
     *
     * @param url            请求地址
     * @param pathSegments   路径段参数
     * @param queryParameter 路径参数
     * @param headers        请求头
     * @param contentType    contentType
     * @param content        content
     * @param onNetCallback  网络事件回调
     */
    public void putAsynch(String url, final List<String> pathSegments, final Map<String, String> queryParameter,
                          Map<String, String> headers, String contentType, byte[] content, final OnNetCallback onNetCallback) {
        mNetManager.putAsynch(url, pathSegments, queryParameter, headers, contentType, content, onNetCallback);
    }

    /**
     * 异步Put请求JSON
     *
     * @param url           请求地址
     * @param params        请求参数
     * @param onNetCallback 网络事件回调
     */
    public void putRequestJsonAsynch(String url, Map<String, String> params, final OnNetCallback onNetCallback) {
        mNetManager.putRequestJsonAsynch(url, params, onNetCallback);
    }

    /**
     * 异步Put请求JSON
     *
     * @param url           请求地址
     * @param headers       请求头
     * @param params        请求参数
     * @param onNetCallback 网络事件回调
     */
    public void putRequestJsonAsynch(String url, Map<String, String> headers, Map<String, String> params, final OnNetCallback onNetCallback) {
        mNetManager.putRequestJsonAsynch(url, headers, params, onNetCallback);
    }

    /**
     * 异步Put请求JSON
     *
     * @param url            请求地址
     * @param pathSegments   路径段参数
     * @param queryParameter 路径参数
     * @param headers        请求头
     * @param params         请求参数
     * @param onNetCallback  网络事件回调
     */
    public void putRequestJsonAsynch(String url, final List<String> pathSegments, final Map<String, String> queryParameter,
                                     Map<String, String> headers, Map<String, String> params, OnNetCallback onNetCallback) {
        mNetManager.putRequestJsonAsynch(url, pathSegments, queryParameter, headers, params, onNetCallback);
    }

    /**
     * 异步Put请求JSON
     *
     * @param url           请求地址
     * @param json          请求json字符串
     * @param onNetCallback 网络事件回调
     */
    public void putRequestJsonAsynch(String url, String json, final OnNetCallback onNetCallback) {
        mNetManager.putRequestJsonAsynch(url, json, onNetCallback);
    }

    /**
     * 异步Put请求JSON
     *
     * @param url           请求地址
     * @param headers       请求头
     * @param json          请求json字符串
     * @param onNetCallback 网络事件回调
     */
    public void putRequestJsonAsynch(String url, Map<String, String> headers, String json, final OnNetCallback onNetCallback) {
        mNetManager.putRequestJsonAsynch(url, headers, json, onNetCallback);
    }

    /**
     * 异步Put请求JSON
     *
     * @param url            请求地址
     * @param pathSegments   路径段参数
     * @param queryParameter 路径参数
     * @param headers        请求头
     * @param json           请求json字符串
     * @param onNetCallback  网络事件回调
     */
    public void putRequestJsonAsynch(String url, final List<String> pathSegments, final Map<String, String> queryParameter,
                                     Map<String, String> headers, String json, OnNetCallback onNetCallback) {
        mNetManager.putRequestJsonAsynch(url, pathSegments, queryParameter, headers, json, onNetCallback);
    }

    /**
     * 异步Post请求
     *
     * @param url           请求地址
     * @param params        请求参数
     * @param onNetCallback 网络事件回调
     */
    public void postAsynch(String url, Map<String, String> params, final OnNetCallback onNetCallback) {
        mNetManager.postAsynch(url, params, onNetCallback);
    }

    /**
     * 异步Post请求
     *
     * @param url           请求地址
     * @param headers       请求头
     * @param params        请求参数
     * @param onNetCallback 网络事件回调
     */
    public void postAsynch(String url, Map<String, String> headers, Map<String, String> params, final OnNetCallback onNetCallback) {
        mNetManager.postAsynch(url, headers, params, onNetCallback);
    }

    /**
     * 异步Post请求
     *
     * @param url            请求地址
     * @param pathSegments   路径段参数
     * @param queryParameter 路径参数
     * @param headers        请求头
     * @param params         请求参数
     * @param onNetCallback  网络事件回调
     */
    public void postAsynch(String url, final List<String> pathSegments, final Map<String, String> queryParameter,
                           Map<String, String> headers, Map<String, String> params, OnNetCallback onNetCallback) {
        mNetManager.postAsynch(url, pathSegments, queryParameter, headers, params, onNetCallback);
    }

    /**
     * 异步Post请求数据
     *
     * @param url           请求地址
     * @param headers       请求头
     * @param contentType   contentType
     * @param content       content
     * @param onNetCallback 网络事件回调
     */
    public void postAsynch(String url, Map<String, String> headers, String contentType, String content, final OnNetCallback onNetCallback) {
        mNetManager.postAsynch(url, headers, contentType, content, onNetCallback);
    }

    /**
     * 异步Post请求数据
     *
     * @param url            请求地址
     * @param pathSegments   路径段参数
     * @param queryParameter 路径参数
     * @param headers        请求头
     * @param contentType    contentType
     * @param content        content
     * @param onNetCallback  网络事件回调
     */
    public void postAsynch(String url, final List<String> pathSegments, final Map<String, String> queryParameter,
                           Map<String, String> headers, String contentType, String content, final OnNetCallback onNetCallback) {
        mNetManager.postAsynch(url, pathSegments, queryParameter, headers, contentType, content, onNetCallback);
    }

    /**
     * 异步Post请求数据
     *
     * @param url           请求地址
     * @param headers       请求头
     * @param contentType   contentType
     * @param content       content
     * @param onNetCallback 网络事件回调
     */
    public void postAsynch(String url, Map<String, String> headers, String contentType, byte[] content, final OnNetCallback onNetCallback) {
        mNetManager.postAsynch(url, headers, contentType, content, onNetCallback);
    }

    /**
     * 异步Post请求数据
     *
     * @param url            请求地址
     * @param pathSegments   路径段参数
     * @param queryParameter 路径参数
     * @param headers        请求头
     * @param contentType    contentType
     * @param content        content
     * @param onNetCallback  网络事件回调
     */
    public void postAsynch(String url, final List<String> pathSegments, final Map<String, String> queryParameter,
                           Map<String, String> headers, String contentType, byte[] content, final OnNetCallback onNetCallback) {
        mNetManager.postAsynch(url, pathSegments, queryParameter, headers, contentType, content, onNetCallback);
    }

    /**
     * 异步Post请求JSON
     *
     * @param url           请求地址
     * @param params        请求参数
     * @param onNetCallback 网络事件回调
     */
    public void postRequestJsonAsynch(String url, Map<String, String> params, final OnNetCallback onNetCallback) {
        mNetManager.postRequestJsonAsynch(url, params, onNetCallback);
    }

    /**
     * 异步Post请求JSON
     *
     * @param url           请求地址
     * @param headers       请求头
     * @param params        请求参数
     * @param onNetCallback 网络事件回调
     */
    public void postRequestJsonAsynch(String url, Map<String, String> headers, Map<String, String> params, final OnNetCallback onNetCallback) {
        mNetManager.postRequestJsonAsynch(url, headers, params, onNetCallback);
    }

    /**
     * 异步Post请求JSON
     *
     * @param url            请求地址
     * @param pathSegments   路径段参数
     * @param queryParameter 路径参数
     * @param headers        请求头
     * @param params         请求参数
     * @param onNetCallback  网络事件回调
     */
    public void postRequestJsonAsynch(String url, final List<String> pathSegments, final Map<String, String> queryParameter,
                                      Map<String, String> headers, Map<String, String> params, OnNetCallback onNetCallback) {
        mNetManager.postRequestJsonAsynch(url, pathSegments, queryParameter, headers, params, onNetCallback);
    }

    /**
     * 异步Post请求JSON
     *
     * @param url           请求地址
     * @param json          请求json字符串
     * @param onNetCallback 网络事件回调
     */
    public void postRequestJsonAsynch(String url, String json, final OnNetCallback onNetCallback) {
        mNetManager.postRequestJsonAsynch(url, json, onNetCallback);
    }

    /**
     * 异步Post请求JSON
     *
     * @param url           请求地址
     * @param headers       请求头
     * @param json          请求json字符串
     * @param onNetCallback 网络事件回调
     */
    public void postRequestJsonAsynch(String url, Map<String, String> headers, String json, final OnNetCallback onNetCallback) {
        mNetManager.postRequestJsonAsynch(url, headers, json, onNetCallback);
    }

    /**
     * 异步Post请求JSON
     *
     * @param url            请求地址
     * @param pathSegments   路径段参数
     * @param queryParameter 路径参数
     * @param headers        请求头
     * @param json           请求json字符串
     * @param onNetCallback  网络事件回调
     */
    public void postRequestJsonAsynch(String url, final List<String> pathSegments, final Map<String, String> queryParameter,
                                      Map<String, String> headers, String json, OnNetCallback onNetCallback) {
        mNetManager.postRequestJsonAsynch(url, pathSegments, queryParameter, headers, json, onNetCallback);
    }

    /**
     * 下载文件，Post方式，请求成功后会在回调中返回文件的输入流
     *
     * @param url           请求地址
     * @param headers       请求头
     * @param params        请求参数
     * @param onNetCallback 网络事件回调
     */
    public void downloadFile(String url, Map<String, String> headers, Map<String, String> params, final OnNetCallback onNetCallback) {
        mNetManager.downloadFile(url, headers, params, onNetCallback);
    }

    /**
     * 下载文件，Post方式，请求成功后会在回调中返回文件的输入流
     *
     * @param url            请求地址
     * @param pathSegments   路径段参数
     * @param queryParameter 路径参数
     * @param headers        请求头
     * @param params         请求参数
     * @param onNetCallback  网络事件回调
     */
    public void downloadFile(String url, final List<String> pathSegments, final Map<String, String> queryParameter,
                             Map<String, String> headers, Map<String, String> params, OnNetCallback onNetCallback) {
        mNetManager.downloadFile(url, pathSegments, queryParameter, headers, params, onNetCallback);
    }

    /**
     * 下载文件，Get方式，请求成功后会在回调中返回文件的输入流
     *
     * @param url           请求地址
     * @param headers       请求头
     * @param onNetCallback 网络事件回调
     */
    public void downloadFile(String url, Map<String, String> headers, final OnNetCallback onNetCallback) {
        mNetManager.downloadFile(url, headers, onNetCallback);
    }

    /**
     * 文件下载，Get方式，请求成功后会在回调中返回文件的输入流
     *
     * @param url            请求地址
     * @param pathSegments   路径段参数
     * @param queryParameter 路径参数
     * @param headers        请求头
     * @param onNetCallback  网络事件回调
     */
    public void downloadFile(String url, final List<String> pathSegments, final Map<String, String> queryParameter,
                             Map<String, String> headers, OnNetCallback onNetCallback) {
        mNetManager.downloadFile(url, pathSegments, queryParameter, headers, onNetCallback);
    }

    /**
     * 图片上传
     *
     * @param url            请求地址
     * @param uploadImageKey 上传图片时该文件对应的参数Key
     * @param imageFileName  要上传的图片文件名
     * @param imageData      要上传的图片字节数据
     * @param headers        请求头
     * @param params         请求参数
     * @param onNetCallback  网络事件回调
     */
    public void uploadImage(String url, String uploadImageKey, String imageFileName, byte[] imageData, Map<String, String> headers,
                            Map<String, String> params, final OnNetCallback onNetCallback) {
        mNetManager.uploadImage(url, uploadImageKey, imageFileName, imageData, headers, params, onNetCallback);
    }

    /**
     * 图片上传
     *
     * @param url            请求地址
     * @param uploadImageKey 上传图片时该文件对应的参数Key
     * @param imageFileName  要上传的图片文件名
     * @param imageData      要上传的图片字节数据
     * @param pathSegments   路径段参数
     * @param queryParameter 路径参数
     * @param headers        请求头
     * @param params         请求参数
     * @param onNetCallback  网络事件回调
     */
    public void uploadImage(String url, String uploadImageKey, String imageFileName, byte[] imageData, final List<String> pathSegments, final Map<String, String> queryParameter,
                            Map<String, String> headers, Map<String, String> params, final OnNetCallback onNetCallback) {
        mNetManager.uploadImage(url, uploadImageKey, imageFileName, imageData, pathSegments, queryParameter, headers, params, onNetCallback);
    }

    /**
     * 文件上传
     *
     * @param url           请求地址
     * @param uploadFileKey 上传文件时该文件对应的参数Key
     * @param uploadFile    要上传的文件
     * @param fileMIME      要上传的文件类型
     * @param headers       请求头，若没有则传null
     * @param params        请求参数，若没有则传null
     * @param onNetCallback 网络事件回调
     */
    public void uploadFile(String url, String uploadFileKey, File uploadFile, String fileMIME, Map<String, String> headers,
                           Map<String, String> params, final OnNetCallback onNetCallback) {
        mNetManager.uploadFile(url, uploadFileKey, uploadFile, fileMIME, headers, params, onNetCallback);
    }

    /**
     * 异步Get请求
     *
     * @param url           请求地址
     * @param onNetCallback 网络事件回调
     */
    public void getAsynch(String url, final OnNetCallback onNetCallback) {
        mNetManager.getAsynch(url, onNetCallback);
    }

    /**
     * 异步Get请求
     *
     * @param url           请求地址
     * @param headers       请求头
     * @param onNetCallback 网络事件回调
     */
    public void getAsynch(String url, Map<String, String> headers, final OnNetCallback onNetCallback) {
        mNetManager.getAsynch(url, headers, onNetCallback);
    }

    /**
     * 异步Get请求
     *
     * @param url            请求地址
     * @param pathSegments   路径段参数
     * @param queryParameter 路径参数
     * @param headers        请求头
     * @param onNetCallback  网络事件回调
     */
    public void getAsynch(String url, final List<String> pathSegments, final Map<String, String> queryParameter,
                          Map<String, String> headers, OnNetCallback onNetCallback) {
        mNetManager.getAsynch(url, pathSegments, queryParameter, headers, onNetCallback);
    }

    /**
     * 同步Get请求
     *
     * @param url 请求地址
     * @return 返回数据
     * @throws IOException 网络访问异常
     */
    public String getSynch(String url) throws IOException {
        return mNetManager.getSynch(url);
    }

    /**
     * 同步Get请求
     *
     * @param url     请求地址
     * @param headers 请求头
     * @return 返回数据
     * @throws IOException 网络访问异常
     */
    public String getSynch(String url, Map<String, String> headers) throws IOException {
        return mNetManager.getSynch(url, headers);
    }

    /**
     * 同步Get请求
     *
     * @param url            请求地址
     * @param pathSegments   路径段参数
     * @param queryParameter 路径参数
     * @param headers        请求头
     * @throws IOException 网络访问异常
     */
    public String getSynch(String url, final List<String> pathSegments, final Map<String, String> queryParameter,
                           Map<String, String> headers) throws IOException {
        return mNetManager.getSynch(url, pathSegments, queryParameter, headers);
    }

    /**
     * 异步Delete请求
     *
     * @param url           请求地址
     * @param onNetCallback 网络事件回调
     */
    public void deleteAsynch(String url, OnNetCallback onNetCallback) {
        mNetManager.deleteAsynch(url, null, null, null, onNetCallback);
    }

    /**
     * 异步Delete请求
     *
     * @param url           请求地址
     * @param headers       请求头
     * @param onNetCallback 网络事件回调
     */
    public void deleteAsynch(String url, Map<String, String> headers, OnNetCallback onNetCallback) {
        mNetManager.deleteAsynch(url, null, null, headers, onNetCallback);
    }

    /**
     * 异步Delete请求
     *
     * @param url            请求地址
     * @param pathSegments   路径段参数
     * @param queryParameter 路径参数
     * @param headers        请求头
     * @param onNetCallback  网络事件回调
     */
    public void deleteAsynch(String url, final List<String> pathSegments, final Map<String, String> queryParameter,
                             Map<String, String> headers, OnNetCallback onNetCallback) {
        mNetManager.deleteAsynch(url, pathSegments, queryParameter, headers, onNetCallback);
    }

    /**
     * 同步Delete请求
     *
     * @param url 请求地址
     * @throws IOException 网络访问异常
     */
    public String deleteSynch(String url) throws IOException {
        return mNetManager.deleteSynch(url, null, null, null);
    }

    /**
     * 同步Delete请求
     *
     * @param url     请求地址
     * @param headers 请求头
     * @throws IOException 网络访问异常
     */
    public String deleteSynch(String url, Map<String, String> headers) throws IOException {
        return mNetManager.deleteSynch(url, null, null, headers);
    }

    /**
     * 同步Delete请求
     *
     * @param url            请求地址
     * @param pathSegments   路径段参数
     * @param queryParameter 路径参数
     * @param headers        请求头
     * @throws IOException 网络访问异常
     */
    public String deleteSynch(String url, final List<String> pathSegments, final Map<String, String> queryParameter,
                              Map<String, String> headers) throws IOException {
        return mNetManager.deleteSynch(url, pathSegments, queryParameter, headers);
    }
}
